package bizzard.client;
import bizzard.shared.Troll;

import java.util.HashMap;
import java.util.List;
import com.google.gwt.user.client.ui.*;

import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SingleSelectionModel;
import com.google.gwt.user.cellview.client.SimplePager;
import com.google.gwt.user.cellview.client.HasKeyboardPagingPolicy.KeyboardPagingPolicy;
import com.google.gwt.user.cellview.client.HasKeyboardSelectionPolicy.KeyboardSelectionPolicy;

import com.google.gwt.cell.client.AbstractCell;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.user.cellview.client.CellList;


//+----------------------------------------------------------------------+
//| ViewImg
//|
//| trolls			: 	hashMap indexé sur le nom du troll
//| widget			: 	panel principal
//| cellList		: 	liste de troll sous forme graphique, utilise la sous-classe TrollCell
//| data	 		:   provider pour cellList, va permettre d'instancier une pagination 
//|
//| - affiche la liste de troll sous forme image
//| - donne le troll à ViewTroll au clic
//+----------------------------------------------------------------------+

public class ViewImg  extends Composite{

	private HashMap<String, Troll> trolls = new HashMap<String, Troll>();
	
	private VerticalPanel widget = new VerticalPanel();
	private CellList<Troll> cellList = new CellList<Troll>(new TrollCell());
	private List<Troll> data;

	public ViewImg() {
    	
        initWidget(widget);
        widget.addStyleName("view viewimg");
        widget.setHorizontalAlignment(VerticalPanel.ALIGN_CENTER);

        //liste des trolls
   	 // TODO trouver le nombre qui va bien
        	cellList.setPageSize(2);
		    cellList.setKeyboardPagingPolicy(KeyboardPagingPolicy.INCREASE_RANGE);
		    cellList.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.BOUND_TO_SELECTION);
	
		    //on ajoute un modele pour gerer la selection
		    final SingleSelectionModel<Troll> selectionModel = new SingleSelectionModel<Troll>();
		    cellList.setSelectionModel(selectionModel);
		    selectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
		      public void onSelectionChange(SelectionChangeEvent event) {
		        ViewTroll.get().setTroll(selectionModel.getSelectedObject());
		      }
		    });   
	    
	        //on ajoute un data provider pour pouvoir utiliser le pager (dans feedList)
	        
	        //on ajoute le pager
		    SimplePager pager = new SimplePager();
		    pager.setDisplay(cellList);
		    widget.add(pager);
		    
		    //et la liste
			widget.add(cellList);
	}
	
	/*******************************************************************************
	 * met à jour l'affichage en fonction de @trolls
	 ******************************************************************************/
    public void updateList() {
    	feedList(trolls);
    }
    
	/*******************************************************************************
	 * setter du hashmap @trolls
	 * 
	 * @param trolls ~ hashmap de trolls
	 ******************************************************************************/
    public void setTrolls(HashMap<String, Troll> trolls) {
    	
    	if(trolls!=null && !trolls.isEmpty()) this.trolls = trolls;
    }
    
	/*******************************************************************************
	 * met à jour les données de la liste
	 * 
	 * @param list_troll ~ hashmap de troll
	 ******************************************************************************/
    private void feedList(HashMap<String, Troll> list_troll) { 

        ListDataProvider<Troll> dataProvider = new ListDataProvider<Troll>();
        data = dataProvider.getList();
        
        if(list_troll.isEmpty() || list_troll==null) return;
	    for (String item : list_troll.keySet()) {
	    	data.add(trolls.get(item));
		}
	    
        dataProvider.addDataDisplay(cellList);
    }
    
	//+----------------------------------------------------------------------+
	//| TrollCell
	//|
	//| - implemente l'affichage du troll en tant que cellule
	//+----------------------------------------------------------------------+
    public class TrollCell extends AbstractCell<Troll> {
    	
    	@Override
    	public void render(com.google.gwt.cell.client.Cell.Context context, Troll item, SafeHtmlBuilder sb) {
    	     if (item == null) return;

	          sb.appendHtmlConstant("<div>");
	          // sb.appendEscaped(value.getName());
	          
	          sb.appendHtmlConstant("<img src='"+item.getImg()+"' alt='img' title='"+item.getName()+"' width=100 height=100>");
	          sb.appendHtmlConstant("</div>");
    	}
    }
}
